import axios from 'axios'
import { Toast } from 'antd-mobile'
import { getTokenInfo, setTokenInfo } from './storage'
import history from '@/utils/history'
import store from '@/store'
import { saveToken } from '@/store/actions/login'
import { logout } from '@/store/actions/profile'
const baseURL = 'http://geek.itheima.net/v1_0'
const instanse = axios.create({
  baseURL: baseURL,
  timeout: 5000,
})

// 请求拦截器
instanse.interceptors.request.use(
  (config) => {
    // 添加请求头
    const token = getTokenInfo().token
    if (token) {
      config.headers.Authorization = 'Bearer ' + token
    }
    return config
  },
  (error) => {
    // Do something with request error
    return Promise.reject(error)
  }
)

// 相应拦截器
instanse.interceptors.response.use(
  (response) => {
    // Do something with response data
    return response.data
  },
  async (error) => {
    // 如果是网络的问题
    if (!error.response) {
      Toast.info('网络超时，请稍后重试', 1)
      return Promise.reject(error)
    }

    // 如果后台没返回401，也不是网络的问题
    if (error.response.status !== 401) {
      Toast.info(error.response.data.message, 1)
      return Promise.reject(error)
    }

    // 网络没问题，且是401的错误
    const { refresh_token } = getTokenInfo()
    // 判断有没有刷新token
    if (!refresh_token) {
      // 没有token就跳转到登录页
      history.push({
        pathname: '/login',
        state: {
          from: history.location.pathname,
        },
      })
      return Promise.reject(error)
    }
    // 如果有刷新token
    try {
      // 通过refresh_token发起请求获取新的token
      // 不可以通过创建的instanse发起请求，因为请求还是会走拦截器
      const res = await axios({
        url: baseURL + '/authorizations',
        method: 'PUT',
        headers: {
          Authorization: 'Bearer ' + refresh_token,
        },
      })
      // console.log(res)
      const tokenInfo = {
        token: res.data.data.token,
        refresh_token: refresh_token,
      }
      // 成功之后将返回的token保存到本地
      setTokenInfo(tokenInfo)
      // 同时保存到redux中
      store.dispatch(saveToken(tokenInfo))
      // 再次调用上次失败的请求
      // console.log(error.config)
      return instanse(error.config)
    } catch {
      // 如果获取新的token失效了
      // 清空本地和redux数据
      // removeTokenInfo()
      store.dispatch(logout())
      // 跳转到登录页
      history.push({
        pathname: '/login',
        state: {
          from: history.location.pathname,
        },
      })
      Toast.info('登录过期，请重新登录', 1)
      return Promise.reject(error)
    }
  }
)

export default instanse
